package day1.udp.mine;

import day1.udp.dictionary_service.Log;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Arrays;

public class UdpServer {

    // 服务器要绑定的端口
    private static final int PORT = 8080;

    public static void main(String[] args) throws IOException {

        // 1.创建服务端DatagramSocket，指定端口，可以发送及接收UDP数据报
        DatagramSocket socket = new DatagramSocket(PORT);
        System.out.println("DEBUG: 服务器 bind 在 8080 端口上");

        // 2.创建数据报，用于接收客户端发送的数据
        byte[] buf = new byte[1024];
        // 构造一个 DatagramPacket 以用来接收数据报，接收的数据保存在字节数组
        DatagramPacket received = new DatagramPacket(buf, buf.length);

        System.out.println("DEBUG: 服务器准备接收数据");
        // 3.等待接收客户端发送的UDP数据报，该方法在接收到数据报之前会一直阻塞
        socket.receive(received);
        System.out.println("DEBUG: 服务器接收到了数据");

        // 对方的地址（ip）
        InetAddress address = received.getAddress();
        System.out.println("DEBUG: 对方的地址为: " + address);
        // 对方的端口（port）
        int port = received.getPort();
        System.out.println("DEBUG: 对方的端口为: " + port);
        // 真正收到的数据长度
        int n = received.getLength();
        System.out.println("DEBUG: 数据长度为: " + n);
        // 真正有用的数据
        byte[] actualData = Arrays.copyOf(buf, n);
        // byte[] + 字符集编码 -> String
        String request = new String(actualData, 0, actualData.length, "UTF-8");
        System.out.println("DEBUG: 解析到的请求为: " + request);

        // 处理请求
        System.out.println("DEBUG: 开始处理请求数据");
        String response = "我们已经对 " + request + " 请求，作出了响应。";
        // String + 字符集编码 -> byte[]
        byte[] bytes = response.getBytes("UTF-8");
        System.out.println("DEBUG: 数据处理完毕");

        // 发送响应
        System.out.println("DEBUG: 准备发送响应");
        DatagramPacket sent = new DatagramPacket(
                bytes, 0, bytes.length,
                address,
                port
        );
        socket.send(sent);
        System.out.println("DEBUG: 响应发送成功");
    }
}
